在本步骤中,使用 Kanzi Engine API 加载在您在本教程的上一步骤中在 Kanzi 应用程序中创建的地区包。
在本节中,您将使用 Kanzi Engine API 加载您在上一节创建的地区包。应用程序在启动时加载地区包,并触发加载存储在 <KanziWorkspace>/Projects/<ProjectName>/Application/bin/Locale_packs 目录中的所有地区的地区包。
要加载地区包:
ja-JP ko-KR zh-ZH
如果您在 Visual Studio 2017 中打开教程解决方案,遇到提示您重新定位工程到最新的 Microsoft 工具集时,请点击取消 (Cancel)。
要从 Kanzi Studio 打开 Kanzi Studio 工程的目录,选择 > 在 Windows 资源管理器中打开 (Open in Windows Explorer)。
DynamicPropertyType
并使用 Kanzi Studio 工程中使用的相同名称。class LocalizationApplication : public ExampleApplication
{
//在 Kanzi Studio 工程中定义的自定义属性类型的共享指针类型。
typedef shared_ptr<DynamicPropertyType<string> > StringDynamicPropertyTypeSharedPtr;
onProjectLoaded
函数的 LocalizationApplication
类中实现事件处理程序,为存储在Locale_packs目录中的地区包 kzb 文件加载资源,并将地区添加到工程中。//设置存储地区包的目录的名称。 static const string localizationFolderName = "Locale_packs"; //获取 kzb 文件中的屏幕 (Screen) 节点。您可以使用屏幕 (Screen) 节点访问 kzb 文件中的所有其他节点和资源。 ScreenSharedPtr screen = getScreen(); //域是所有子系统的集合,包含 Kanzi 资源管理器。您需要让资源管理器访问 kzb 文件中的资源。 ResourceManager* resourceManager = getDomain()->getResourceManager(); //获取含地区选择按钮的LocaleSelector 节点。 // 使用#
符号后跟别名名称访问别名目标节点。 Node2DSharedPtr localeSelector = screen->lookupNode<Node2D>("#LocaleSelector"); //获取用于设置地区的按钮的 LocaleButton 预制模板。 //使用 kzb URL 获取对模板的参考。 // 您使用完整的 kzb 资源路径时,路径以kzb://
开头,后跟工程名称和资源位置。 PrefabTemplateSharedPtr localeButtonPrefab = resourceManager->acquireResource<PrefabTemplate>("kzb://localization/Prefabs/LocaleButton"); //获取自定义属性类型以设置 // LocaleButton 节点中的地区的名称。您在 Kanzi Studio 工程中创建了自定义属性类型。 StringDynamicPropertyTypeSharedPtr localeNameProperty = StringDynamicPropertyTypeSharedPtr(new DynamicPropertyType<string>("Localization.LocaleName")); //获取自定义属性类型以设置应用程序中的地区。 //您在 Kanzi Studio 工程中创建了自定义属性类型。 StringDynamicPropertyTypeSharedPtr localeIdProperty = StringDynamicPropertyTypeSharedPtr(new DynamicPropertyType<string>("Localization.LocaleID")); //读取包含//有地区包的 kzb 文件列表的 binaries.cfg 文件。 string configFileName = localizationFolderName + "/binaries.cfg"; ReadOnlyDiskFile binariesConfigFile(configFileName); string binariesConfigContents = readAsText(binariesConfigFile); stringstream binariesConfigFileStream(binariesConfigContents); string localeId; //加载存储在地区包 kzb 文件中的资源。 while (getline(binariesConfigFileStream, localeId)) { trim(localeId); //创建 kzb 文件路径。 string localizationKzbFilePath = localizationFolderName + "/" + localeId + ".kzb"; //将 kzb 文件添加到 Kanzi 资源管理器。 getResourceManager()->addKzbFile(localizationKzbFilePath); string dictionaryUrl = "kzb://localization/Locales/" + localeId; ResourceDictionarySharedPtr localeDictionary = getResourceManager()->acquireResource<ResourceDictionary>(dictionaryUrl); //实例化 LocaleButton 预设件。 Node2DSharedPtr localeButton = localeButtonPrefab->instantiate<Node2D>("LocaleButton_" + localeId); //从存储在地区包中的地区表中的资源 ID LocaleDisplayName //获取显示在应用程序中的地区的名称。 TextResourceSharedPtr localeDisplayNameResource = localeDictionary->acquire<TextResource>(ResourceID("LocaleDisplayName")); //设置 LocaleName 属性,使按钮中的 Text Block 2D 节点显示地区的名称。 localeButton->setProperty(*localeNameProperty, localeDisplayNameResource->getText()); //设置 LocaleID 属性,您点击按钮时应用程序更改为该地区。 localeButton->setProperty(*localeIdProperty, localeId); //设置按钮中 Text Block 2D 节点的样式,为 //地区的 LocaleDisplayName 设置正确的字体。 //使用这种方法仅应用地区包中的样式而不改变应用程序中的地区 //。 optional<string> localeStyle = localeDictionary->find(ResourceID("LocaleStyle")); StyleSharedPtr style = getResourceManager()->acquireResource<Style>(*localeStyle); localeButton->setStyle(style); //将 LocaleButton 节点添加到 LocaleSelector 节点。 localeSelector->addChild(localeButton); }
在应用程序中 Kanzi 从 binaries.cfg 文件中列出的文件 kzb 文件中加载地区包,并在 LocaleSelector 节点中为每个地区实例化一个LocaleButton 预设件。
在本教程中,您学习了如何本地化 Kanzi 应用程序,并在您的应用程序中使用仅包含本地化资源的其他 kzb 文件。要进一步学习本教程,您可以使用本地化表 .pot 模板将 Kanzi 应用程序的内容翻译到其他语言。另外,您可以创建其他资源类型,并为不同的地区创建不同的资源。例如,创建几个动画并各用于不同的地区:
要详细了解有关如何本地化您的 Kanzi 应用程序的信息,请参阅本地化。
要详细了解有关 kzb 文件的信息,请参阅使用 kzb 文件。
要了解有关 Kanzi 如何处理资源的信息,请参阅资源管理。
要详细了解有关如何使用资源字典的信息,请参阅资源。
要详细了解有关如何使用应用程序中字体的信息,请参阅导入字体。
要详细了解有关如何使用应用程序中状态机的信息,请参阅使用状态机。
要详细了解有关管理Kanzi Studio工程的信息,请参阅工程。
要了解创建Kanzi 应用程序的更多信息,请参阅教程。
要了解有关 Kanzi Studio 功能的更多信息,请参阅使用 ...。